#include "musicplayer.h"

/*
#include <QApplication>: QApplication是Qt中的应用程序类，用于管理应用程序的生命周期和全局状态。
#include <QCommandLineParser>: QCommandLineParser是用于解析命令行参数的类，可以方便地获取和处理命令行参数。
#include <QCommandLineOption>: QCommandLineOption用于定义命令行选项，包括选项的名称、描述和类型等信息。
#include <QDesktopWidget>: QDesktopWidget提供了关于桌面的信息，如可用的屏幕大小和显示器的数量。
#include <QFileInfo>: QFileInfo提供了有关文件和目录的信息，如文件名、路径、大小等。
#include <QMimeDatabase>: QMimeDatabase用于获取和管理MIME类型，包括文件扩展名和对应的MIME类型。
#include <QSettings>: QSettings用于读取和写入应用程序的设置，包括配置文件和注册表等。
#include <QIcon>: QIcon用于表示图标，可以用于设置窗口的图标或按钮的图标等。
#include <QDir>: QDir提供了对目录和文件的访问功能，如创建目录、列出目录中的文件等。
#include <QUrl>: QUrl用于表示统一资源定位符（URL），可以用于处理文件路径、网络地址等。
*/
#include <QApplication>
#include <QCommandLineParser>
#include <QCommandLineOption>
#include <QDesktopWidget>
#include <QFileInfo>
#include <QMimeDatabase>
#include <QSettings>
#include <QIcon>
#include <QDir>
#include <QUrl>
#include <QtDebug>

//! [关联文件类型]
static bool associateFileTypes()
{
    QString displayName = QGuiApplication::applicationDisplayName();
    QString filePath = QCoreApplication::applicationFilePath();
    QString fileName = QFileInfo(filePath).fileName();


    /*
     *  key =  "HKEY_CURRENT_USER\\Software\\Classes\\Applications\\musicplayer.exe"
        对于你提供的代码中的注册表项，它的完整路径是"HKEY_CURRENT_USER\Software\Classes\Applications" + fileName。这里的fileName是一个文件名。
        要查看这个注册表项，你可以按照以下步骤操作：
        打开注册表编辑器：在Windows系统中，按下Win + R键，输入"regedit"，然后按下回车键，即可打开注册表编辑器。
        在注册表编辑器中，展开"HKEY_CURRENT_USER"，然后再依次展开"Software"、"Classes"和"Applications"，找到对应的文件名项。
    */
    const QString key = QStringLiteral("HKEY_CURRENT_USER\\Software\\Classes\\Applications\\") + fileName;
    qDebug()<<"displayName = "<<displayName<<" filePath = "<<filePath<<" fileName = "<<fileName<<" key = "<<key<<endl;

    QSettings settings(key, QSettings::NativeFormat);
    if (settings.status() != QSettings::NoError) {
        qWarning() << "无法访问注册表项" << key;
        return false;
    }
    settings.setValue(QStringLiteral("FriendlyAppName"), displayName);

    settings.beginGroup(QStringLiteral("SupportedTypes"));
    /*
        QMimeDatabase是Qt框架中的一个类，用于管理和查询MIME类型的数据库。MIME类型是一种用于标识文件类型的标准，它通常以文件扩展名的形式存在（例如，.txt表示文本文件）。
        QMimeDatabase可以通过文件名、文件后缀或文件内容来确定文件的MIME类型。

        使用QMimeDatabase，你可以执行以下操作：
        - 获取文件的MIME类型：通过调用QMimeDatabase的mimeTypeForFile()函数，传入文件路径作为参数，可以获取到对应文件的MIME类型。
        - 获取已注册的MIME类型：通过调用QMimeDatabase的allMimeTypes()函数，可以获取到系统中已注册的所有MIME类型。
        - 判断文件类型是否匹配某个MIME类型：通过调用QMimeDatabase的mimeTypeForFileNameAndData()函数，传入文件路径和文件内容作为参数，可以判断文件类型是否与指定的MIME类型匹配。

        QMimeDatabase是Qt中处理文件类型的重要工具，可以帮助你进行文件类型识别和处理。
    */
    QMimeDatabase mimeDatabase;
    const QStringList supportedMimeTypes = MusicPlayer::supportedMimeTypes();
    for (const QString &fileType : supportedMimeTypes) {
        const QStringList suffixes = mimeDatabase.mimeTypeForName(fileType).suffixes(); // 获取文件后缀集合
        qDebug()<<"suffixes = "<<suffixes<<endl;
        for (QString suffix : suffixes) {
            suffix.prepend('.');
            settings.setValue(suffix, QString());  // 保存为.文件后缀名形式
        }
    }
    settings.endGroup();

    settings.beginGroup(QStringLiteral("shell"));
    settings.beginGroup(QStringLiteral("open"));
    settings.setValue(QStringLiteral("FriendlyAppName"), displayName);
    settings.beginGroup(QStringLiteral("Command"));
    settings.setValue(QStringLiteral("."),
                      QLatin1Char('"') + QDir::toNativeSeparators(filePath) + QStringLiteral("\" \"%1\""));

    return true;
}
//! [END]

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QCoreApplication::setApplicationName(QStringLiteral("MusicPlayer"));
    QCoreApplication::setApplicationVersion( QLatin1String(QT_VERSION_STR));
    QCoreApplication::setOrganizationName(QStringLiteral("QtWinExtras"));
    QCoreApplication::setOrganizationDomain(QStringLiteral("qt-project.org"));
    QGuiApplication::setApplicationDisplayName(QStringLiteral("QtWinExtras Music Player"));

    if (!associateFileTypes())
        return -1;

    /*
        Usage: D:\QT\Qt5.14.2\Examples\Qt-5.14.2\winextras\build-musicplayer-Desktop_Qt_5_14_2_MinGW_64_bit-Debug\debug\musicplayer.exe [options] url
        QtWinExtras Music Player

        Options:
          -?, -h, --help  显示有关命令行选项的帮助信息。
          --help-all      显示包括qt特定选项在内的帮助。
          -v, --version   显示包括qt特定选项在内的帮助。

        Arguments:
          url             The URL to open.
    */
    QCommandLineParser parser;
    parser.setApplicationDescription(QGuiApplication::applicationDisplayName());
    parser.addHelpOption();
    parser.addVersionOption();
    // 使用addPositionalArgument()函数添加一个位置参数，该参数名为"url"，描述为"The URL to open."，位置参数是在命令行中没有前缀的参数，例如"myapp.exe www.example.com"。
    parser.addPositionalArgument(QStringLiteral("url"), MusicPlayer::tr("The URL to open."));
    parser.process(app);

    MusicPlayer player; // 去执行构造函数

    /*
        通过QUrl::fromUserInput()函数将位置参数解析为QUrl对象，并使用QDir::currentPath()函数获取当前路径作为基础路径，
        使用QUrl::AssumeLocalFile参数来指示URL是一个本地文件。
        然后，通过player.playUrl()函数将解析得到的URL传递给播放器进行播放。
    */
    if (!parser.positionalArguments().isEmpty())
        player.playUrl(QUrl::fromUserInput(parser.positionalArguments().constFirst(), QDir::currentPath(), QUrl::AssumeLocalFile));
    else
        player.playUrl(QUrl::fromUserInput(":/mp3/Go_Beyond_Andy.mp3",QDir::currentPath(), QUrl::AssumeLocalFile));
    // 获取可用的桌面区域的矩形。可用的桌面区域是指不包括任务栏或其他遮挡窗口的区域。
    const QRect availableGeometry = QApplication::desktop()->availableGeometry(&player);
    player.resize(availableGeometry.width() / 6, availableGeometry.height() / 17);
    player.show();

    return app.exec();
}
